silence
Goto Top

Eine TXT-Datei auslesen und gesuchten Inhalt mit Treffer in eine andere Textdatei schreiben

Hallo zusammen

Ich habe mehrere Textdateien, die unterschiedlich aufgebaut sind, teilweise weisen sie ein Muster auf wie ein csv, oder aber auch ursprünglich aus einem XML voller Code.

In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.

Beispiel

Abgaskrümmer</Value>
</Values>
</ID>
<ID="AZQ_125875" >
<Name>258555600 - VW Golf</Name>


In neues Textfile
AZQ_125875
usw.

Wie krieg ich das am besten hin?

Besten Dank für Eure Hilfe

Content-Key: 73849983741

Url: https://administrator.de/contentid/73849983741

Printed on: June 3, 2024 at 07:06 o'clock

Member: godlie
godlie Sep 14, 2023 at 11:28:22 (UTC)
Goto Top
Hallo,

eigentlich recht einfach, durch die Dateien loopen und dann pro datei suchen
$currentDirectory = Get-Location
$files = Get-ChildItem -Path $currentDirectory -Filter *.txt
foreach ($file in $files) {
    $content = Get-Content -Path $file
    $matches = Select-String -Path $file -Pattern "<ID="(.*)">  
    $id = $matches.Matches[0].Groups[1]
    Write-Host "Die ID in $file ist $id"  
}

grüße supported by GoogleBard ;)
Mitglied: 7907292512
Solution 7907292512 Sep 14, 2023 updated at 12:14:00 (UTC)
Goto Top
In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.
Biddeschön
(Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt  

Gruß sid
Member: TK1987
Solution TK1987 Sep 14, 2023 at 12:07:55 (UTC)
Goto Top
Moin,

ich würde da einfach mit Select-String arbeiten...
(Select-String "AZQ_(\d{1,10})" -Path "D:\Test\*.txt").Matches.Value  

Gruß Thomas
Member: Silence
Silence Sep 14, 2023 at 13:26:26 (UTC)
Goto Top
Zitat von @7907292512:

In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.
Biddeschön
(Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt  

Gruß sid

Hi Sid, das ist die Lösung, herzlichen Dank! Funktioniert und dann auch noch ruck zuck!
Member: Silence
Silence Sep 14, 2023 at 13:27:57 (UTC)
Goto Top
Zitat von @TK1987:

Moin,

ich würde da einfach mit Select-String arbeiten...
(Select-String "AZQ_(\d{1,10})" -Path "D:\Test\*.txt").Matches.Value  

Gruß Thomas

Hi Thomas

Und auch das funktioniert, einfach ohne Ausgabe in ein File. Aber auch perfekt!!!
Member: Silence
Silence Sep 14, 2023 at 13:28:20 (UTC)
Goto Top
Danke Euch allen für die schnelle und profesionelle Hilfe
LG
Silence
Member: Silence
Silence Sep 15, 2023 at 08:00:58 (UTC)
Goto Top
Das Ding macht wirklich Freude, liest mehrere Files aus die zum Teil bis zu 1 GB gross sind. Eine Frage hätte ich noch.
Nun wird in ein File z.B. folgender Inhalt gelistet:

AZQ_123
AZQ_456
AZQ_897

Die Datei hat einen speziellen Namen, z.B. Auflistung_aus_File_1.txt

Ich möchte später die Dateien zusammenführen, so dass ich sehe, welche Einträge aus welchen Files stammen. Bestimmte Einträge können auch aus mehreren Files stammen.

Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897

Ich bin Neuling und weiss nicht wie ich das zustandebringe mit dem Code

(Select-String "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt

Was genau müsste ich wo einsetzen?

Danke vielmals
Mitglied: 7907292512
7907292512 Sep 15, 2023 updated at 08:13:43 (UTC)
Goto Top
Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches | %{$_.Path + " : " + (($_.Matches.Value | select -Unique) -join ',')} | set-content .\ergebnis.txt  
Member: Silence
Silence Sep 15, 2023 at 08:35:32 (UTC)
Goto Top
Zitat von @7907292512:

Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches | %{$_.Path + " : " + (($_.Matches.Value | select -Unique) -join ',')} | set-content .\ergebnis.txt  

Hmm, Text kommt rein als Pfad, aber leider werden nun bestimmte Einträge nicht mehr untereinander, sondern teilweise mit Komma getrennt hintereinander gezeigt.

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456, AZQ_897
Herkunft File 1 AZQ_897

Ich möchte wie vorher alles untereinander, nur einen Eintrag und mit vorangestelltem Text.
Member: TK1987
TK1987 Sep 15, 2023 updated at 08:38:25 (UTC)
Goto Top
Moin,

Zitat von @Silence:
Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
macht es dann nicht mehr Sinn, das Ganze direkt als Tabelle auszugeben?

Bestimmte Einträge können auch aus mehreren Files stammen.
Hier könnte man die Herkunft dann auch gleich gruppieren, sodass jede Nummer eindeutig ist...
Select-String "AZQ_\d{1,10}" *.txt | group {$_.Matches.Value} | %{[PsCustomObject][Ordered]@{Herkunft=$_.Group.Filename -Join ', ' ; Nummer = $_.Name}} | Export-CSV -Path "Ausgabe.csv" -Delimiter ';' -NoTypeInfo -Encoding UTF8  

Gruß Thomas
Member: Silence
Silence Sep 15, 2023 at 08:43:24 (UTC)
Goto Top
Zitat von @TK1987:

Moin,

Zitat von @Silence:
Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
macht es dann nicht mehr Sinn, das Ganze direkt als Tabelle auszugeben?

Bestimmte Einträge können auch aus mehreren Files stammen.
Hier könnte man die Herkunft dann auch gleich gruppieren, sodass jede Nummer eindeutig ist...
Select-String "AZQ_\d{1,10}" *.txt | group {$_.Matches.Value} | %{[PsCustomObject][Ordered]@{Herkunft=$_.Group.Filename -Join ', ' ; Nummer = $_.Name}} | Export-CSV -Path "Ausgabe.csv" -Delimiter ';' -NoTypeInfo -Encoding UTF8  

Gruß Thomas

Genial, das ist es!!! Danke vielmals Thomas
Member: Silence
Silence Sep 15, 2023 at 10:15:02 (UTC)
Goto Top
Jetzt hab ich ein neues Phänomen mit einer Datei die ursprünglich mal ein XML war. Nun kommt das ganze so daher:

Herkunft File 1, Herkunft File 2 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
Mitglied: 7907292512
Solution 7907292512 Sep 15, 2023 at 10:26:04 (UTC)
Goto Top
$result = foreach($file in Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches){  
    foreach($match in $file.matches.value | select -Unique){
        [pscustomobject][ordered]@{
            File = $file.Path
            Number = $match
        }
    }
}
$result | export-csv .\ergebnis.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
Member: Silence
Silence Sep 19, 2023 at 08:31:27 (UTC)
Goto Top
Hi Experten, ich hätte noch eine Frage. Wenn in ganz seltenen Fällen Textteile auftreten, die nach dem "_" nicht nur Digits, sondern auch einen Buchstaben enthalten, wie müsste ich diesen Code anpassen/erweitern? Ich kriegs einfach nicht hin.

Als wenn z.B. solche Fälle auftreten:

AZQ_123456 (funktioniert jetzt, wird mit untigem Code sauber gefunden)
AZQ_BSDCW (gibts in selten Fällen und kann ich nicht finden mit aktuellem Code)

#Alle Ergebnisfiles mit AZQ_digits werden zusammengeführt und der Filename wird vorangestellt
$result = foreach($file in Select-String  $ResultDrive\*.txt -Pattern "AZQ_\d{1,10}" -AllMatches){    
    foreach($match in $file.matches.value | select -Unique){
        [pscustomobject][ordered]@{
            Exportdatei = $file.filename
            Attribut = $match

Herzlichen Dank für Eure Hilfe
Mitglied: 7907292512
Solution 7907292512 Sep 19, 2023 updated at 08:52:13 (UTC)
Goto Top
Den Regex im Pattern anpassen ...
-Pattern "AZQ_[a-z\d]{1,10}"  
Member: Silence
Silence Sep 19, 2023 at 10:51:09 (UTC)
Goto Top
Danke Dir vielmals Siddius 👍